# 文件操作
# 文件打开的内容模式有
# t：文本文件（默认模式）
# b：二进制文件
# 文件打开的操作模式有
# r: 只读模式（默认模式）
# w: 只写模式
# a: 追加模式
# +：r+ w+ a+ 读写模式

# 打开文件
f = open(r"a.txt", mode="rt", encoding="utf-8")  # 默认模式rt 可以不写
print(f)  # 文件对象 又称为文件句柄
# 读取文件
data = f.read()  # t模式默认将文件使用unicode解码
print(data)
# 关闭文件 回收资源
f.close()

# with 上下文管理打开文件 自动关闭文件
with open("a.txt", mode="rt", encoding="utf-8") as f1, open("a.txt", mode="rt", encoding="utf-8") as f2:
    res1 = f1.read()
    res2 = f2.read()
    print(res1)
    print(res2)

# r 只读模式（默认模式） 如果文件不存在会报错 read()会一次读取所有行

# r模式案例
# input_username = input("请输入用户名：").strip()
# input_password = input("请输入密码：").strip()
# with open("userinfo.txt", mode="rt", encoding="utf-8") as f3:
#     for line in f3:
#         username, password = line.strip().split(':')
#         if input_username == username and input_password == password:
#             print("登录成功")
#             break
#     else:
#         print("用户名或密码错误")

# w 只写模式 如果文件不存在会创建文件 如果文件存在使用w模式打开会清空文件
with open("b.txt", mode="wt", encoding="utf-8") as f4:
    f4.write("abcd")
# writelines()可以写入列表  列表中只能是str，可以使用 '哈哈哈'.encode("utf-8") 或者 bytes("哈哈哈",encoding="utf-8")

# a 追加模式 如果文件不存在会创建文件 如果文件存在 指针移动到末尾
with open("b.txt", mode="at", encoding="utf-8") as f5:
    f5.write("1234")
with open("b.txt", mode="at", encoding="utf-8") as f6:
    f6.write("2345")

# + 加模式
with open("b.txt", mode="r+t", encoding="utf-8") as f7:
    print(f7.read())
    f7.write("2345")

# x 只写模式 如果文件不存在会创建文件 如果文件存在则报错

# b 二进制模式 以bytes为单位 不能指定编码
with open("a.txt", mode="rb") as f8:
    f8.read()  # 把硬盘中的文件作为二进制读取到内存，t模式read还会解码

# 读取文件方式一：通过read(1024) 控制每次读取字节数量 t模式中read(n) n代表字符数 b模式n代表 字节
# 读取文件方式二：通过for循环读取每行 一行可能会导致读取数据量过大


# 文件的指针操作 文件指针的移动都是以bytes为单位

# f.seek(n,m) n表示移动的字节数 m代表模式  只有0模式可以在t模式使用  1、2模式只能在b模式下使用
# 模式0: 从文件开始为参照
# f.seek(3,0) 位置 3
# 模式1: 从当前位置为参照
# f.seek(2,1)
# 模式2: 从文件末尾为参照
# f.seek(-2,2) 因为位置在末尾，应该倒着移动

# f.tell() 获取文件指针的位置


# 文件修改的两种方式
# 方式一  内存占用大 硬盘占用小
with open("a.txt", mode="rt", encoding="utf-8") as f9:
    res3=f9.read()
    data=res3.replace("a","哈")
with open("a.txt", mode="wt", encoding="utf-8") as f10:
    f10.write(data)

# 方式二 内存占用小 硬盘占用大
import os
with open("a.txt", mode="rt", encoding="utf-8") as f11, \
        open(".a.txt.swap", mode="wt", encoding="utf-8") as f12:
    for line in f11:
        f12.write(line.replace("哈","a"))
os.remove("a.txt")
os.rename(".a.txt.swap", "a.txt")



